home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / CPP / CFONT100.ZIP / FONTDEMO.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-07  |  12.0 KB  |  436 lines

  1. /*
  2.     FONTDEMO.CPP
  3.     Demo of the ColorFont class
  4.  
  5.     Written by Nikolai Soumarokov
  6.     Some graphics routines were borrowed from the book
  7.     "Tricks of the Game Programming Gurus" by Andre LaMothe et al.
  8.  
  9.     Build with Turbo C++ 3.0 or above using LARGE memory model
  10. */
  11.  
  12. #include <conio.h>
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <dos.h>
  17. #include <alloc.h>
  18. #include "cfont.h"
  19.  
  20. #define VGA256                  0x13
  21. #define TEXT_MODE               0x03
  22. #define PALETTE_MASK            0x3C6
  23. #define PALETTE_REGISTER        0x3C8
  24. #define PALETTE_DATA            0x3C9
  25. #define SCREEN_WIDTH            320
  26. #define SCREEN_HEIGHT           200
  27.  
  28.  
  29. typedef unsigned char far * far_pointer;
  30.  
  31. // pointers to VGA page
  32. far_pointer video_buf = (unsigned char far *)0xA0000000L;
  33. unsigned int far *video_buf_w = (unsigned int far *)0xA0000000L;
  34.  
  35. // pointer to double buffer
  36. far_pointer doubl_buf;
  37.  
  38. ColorFont BigFont("bigfont.fnt");
  39. ColorFont SmallFont("3dfont.fnt");
  40.  
  41.  
  42. int load_some_palette(void);
  43. void demo();
  44. void page_1();
  45. void page_2();
  46. void page_3();
  47. void page_4();
  48. void page_5();
  49. void page_6();
  50. void page_7();
  51. void page_8();
  52. void transit_1();
  53. void transit_2();
  54. void transit_3a();
  55. void transit_3b();
  56. int  press_a_key();
  57.  
  58.  
  59. main() {
  60.  
  61.     doubl_buf = (far_pointer) farcalloc(1,64000);
  62.     if (!doubl_buf) {
  63.     puts("Not enough memory");
  64.     exit(1);
  65.     }
  66.  
  67.     asm {                // Switch to VGA 320x200 mode
  68.     mov ah,0
  69.     mov al,VGA256
  70.     int 10h
  71.     }
  72.  
  73.     if (!load_some_palette()) {
  74.     asm {                // Switch back to text mode
  75.         mov ah,0
  76.         mov al,TEXT_MODE
  77.         int 10h
  78.     }
  79.     puts("Error loading palette");
  80.     exit(1);
  81.     }
  82.  
  83.     // tell the fonts to print directly to VGA screen
  84.     BigFont.SetVideoAddress(video_buf);
  85.     SmallFont.SetVideoAddress(video_buf);
  86.  
  87.     // set the character translation tables
  88.     BigFont.SetTranslation("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!:#$%&()-.,'\"");
  89.     SmallFont.SetTranslation("ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789!:#$%&()-.,'\"");
  90.  
  91.     // tell the fonts that the letter '0' should look as 'O'
  92.     BigFont.SetSameChar('0','O');
  93.     SmallFont.SetSameChar('0','O');
  94.  
  95.     demo();
  96.  
  97.     asm {                // Switch back to text mode
  98.     mov ah,0
  99.     mov al,TEXT_MODE
  100.     int 10h
  101.     }
  102.  
  103.     farfree(doubl_buf);
  104.     return 0;
  105. }
  106.  
  107.  
  108.  
  109. void demo() {
  110.  
  111.     page_1();
  112.     if (press_a_key()) return;
  113.     transit_1();
  114.     page_2();
  115.     if (press_a_key()) return;
  116.     transit_2();
  117.     page_3();
  118.     if (press_a_key()) return;
  119.     transit_1();
  120.     page_4();
  121.     if (press_a_key()) return;
  122.     transit_1();
  123.     page_5();
  124.     if (press_a_key()) return;
  125.     transit_1();
  126.     page_6();
  127.     if (press_a_key()) return;
  128.     transit_3a();
  129.     page_7();
  130.     transit_3b();
  131.     if (press_a_key()) return;
  132.     transit_1();
  133.     page_8();
  134.     if (press_a_key()) return;
  135.     return;
  136. }
  137.  
  138.  
  139. void page_1() {
  140.     BigFont.BPrint(35,0,"COLORFONT CLASS");
  141.     SmallFont.Repaint(2,71,103,73,105);
  142.     SmallFont.BPrint(50,20,"DEMONSTRATION PROGRAM");
  143.     SmallFont.Repaint(2,103,55,105,57);
  144.     SmallFont.BPrint(50,34,"BY NIKOLAI SOUMAROKOV");
  145.     SmallFont.Repaint(2,55,167,57,169);
  146.     SmallFont.BPrint(0,55,"- WORKS IN STANDARD 320X200X256\n  GRAPHICS MODE");
  147.     SmallFont.BPrint(0,78,"- CAN PRINT TO SCREEN OR TO ANY");
  148.     SmallFont.BPrint(0,88,"  USER-DEFINED MEMORY BUFFER");
  149.     SmallFont.BPrint(0,101,"- READS FONT FILES CREATED WITH");
  150.     SmallFont.BPrint(0,111,"  'GNOOM II' SPRITE EDITOR");
  151.     SmallFont.BPrint(0,124,"- SUPPORTS UP TO 255 CHARACTERS");
  152.     SmallFont.BPrint(0,134,"  PER FONT. THE NUMBER OF FONTS");
  153.     SmallFont.BPrint(0,144,"  IS LIMITED ONLY BY COMPUTER'S");
  154.     SmallFont.BPrint(0,154,"  MEMORY");
  155.     SmallFont.BPrint(0,167,"- IS ABSOLUTELY FREE!");
  156.     SmallFont.Repaint(2,167,199,169,201);
  157. }
  158.  
  159. void page_2() {
  160.     BigFont.Repaint(2,68,36,72,40);
  161.     BigFont.BPrint(50,0,"LOADING FONTS");
  162.     SmallFont.Repaint(2,199,71,201,73);
  163.     SmallFont.BPrint(60,20,"COULD NOT BE EASIER");
  164.  
  165.     SmallFont.Repaint(2,71,167,73,171);
  166.     SmallFont.BPrint(10,55,"    CREATE YOUR FONT WITH   ");
  167.     SmallFont.BPrint(15,65,"THE 'GNOOM II' SPRITE EDITOR");
  168.     SmallFont.BPrint(15,75,"(AVAILABLE ON X2FTP.OULU.FI)");
  169.     SmallFont.BPrint(10,85,"AND LOAD IT INTO YOUR PROGRAM");
  170.     SmallFont.BPrint(15,95," WITH A SINGLE DECLARATION:");
  171.     SmallFont.Repaint(2,167,105,171,107);
  172.     SmallFont.BPrint(15,115,"COLORFONT BIGFONT(FILE_NAME)");
  173.     SmallFont.Repaint(2,105,167,107,171);
  174.     SmallFont.BPrint(25,135,"YOU CAN OPEN AS MANY FONTS");
  175.     SmallFont.BPrint(25,145,"       AS YOU WANT!       ");
  176.     SmallFont.Repaint(2,167,199,171,201);
  177. }
  178.  
  179.  
  180. void page_3() {
  181.     SmallFont.Repaint(2,199,167,201,171);
  182.     SmallFont.BPrint(10,55,"USE THE");
  183.     SmallFont.BPrint(30,65,"FUNCTION TO DEFINE STRING");
  184.     SmallFont.BPrint(70,75,"TRANSLATION RULES");
  185.     SmallFont.BPrint(5,95,"USE THE");
  186.     SmallFont.BPrint(10,105,"FUNCTION TO SET UP CHARACTERS");
  187.     SmallFont.BPrint(30,115,"WHICH LOOK THE SAME - FOR");
  188.     SmallFont.BPrint(10,125,"EXAMPLE, O-DIGIT AND O-LETTER");
  189.     SmallFont.Repaint(2,167,105,171,107);
  190.     SmallFont.BPrint(90,55,"SETTRANSLATION(\"...\")");
  191.     SmallFont.BPrint(85,95,"SETSAMECHAR('C1','C2')");
  192.     SmallFont.Repaint(2,105,199,107,201);
  193. }
  194.  
  195.  
  196. void page_4() {
  197.     unsigned int i;
  198.  
  199.     BigFont.BPrint(48,0,"PRINTING FONTS");
  200.  
  201.     for (i=30; i<78; i++) _fmemset(video_buf_w+i*160,i+82,320);
  202.  
  203.     SmallFont.Repaint(2,199,167,201,171);
  204.     SmallFont.BPrint(145,35,"- PRINTS A STRING");
  205.     SmallFont.Print (145,45,"- PRINTS A STRING");
  206.     SmallFont.Print (145,55,"  PRESERVING THE\n  BACKGROUND");
  207.     SmallFont.BPrint(150,85,"AND");
  208.     SmallFont.BPrint(10,95,"ARE ANALOGOUS BUT ALSO SUPPORT");
  209.     SmallFont.BPrint(120,105,"CLIPPING");
  210.     SmallFont.BPrint(0,125,"USE");
  211.     SmallFont.BPrint(150,135,"AND");
  212.     SmallFont.BPrint(30,145,"TO PRINT SINGLE CHARACTERS");
  213.     SmallFont.Repaint(2,167,105,171,107);
  214.     SmallFont.Print(5,35,"BPRINT(X,Y,S)");
  215.     SmallFont.Print(5,45," PRINT(X,Y,S)");
  216.     SmallFont.BPrint(0,85,"CBPRINT(X,Y,S)     CPRINT(X,Y,S)");
  217.     SmallFont.BPrint(0,125,"    BPUTCH(X,Y,C), PUTCH(X,Y,C),");
  218.     SmallFont.BPrint(0,135,"CBPUTCH(X,Y,C)     CPUTCH(X,Y,C)");
  219.  
  220.     SmallFont.Repaint(2,105,199,107,201);
  221. }
  222.  
  223.  
  224. void page_5() {
  225.  
  226.     int oldc1, oldc2;
  227.     unsigned char i;
  228.  
  229.     BigFont.BPrint(48,0,"PRINTING FONTS");
  230.  
  231.     SmallFont.Repaint(2,199,167,201,171);
  232.     SmallFont.BPrint(0,25,"USE THE");
  233.     SmallFont.BPrint(10,35, "FUNCTION TO DEFINE HORIZONTAL");
  234.     SmallFont.BPrint(5,45,"AND VERTICAL CHARACTER SPACING");
  235.     SmallFont.BPrint(240,135,"AND");
  236.     SmallFont.BPrint(190,145,"FUNCTIONS");
  237.     SmallFont.BPrint(5,155,"ALLOW YOU TO CHANGE FONT COLORS");
  238.     SmallFont.Repaint(2,167,105,171,107);
  239.     SmallFont.BPrint(80,25,"SETSPACING(HSPAC,VSPAC)");
  240.     SmallFont.BPrint(50,135,"CHANGECOLOR(C1,C2)");
  241.     SmallFont.BPrint(40,145,"REPAINT(N,...)");
  242.     SmallFont.Repaint(2,105,71,107,75);
  243.     SmallFont.SetSpacing(10);
  244.     SmallFont.BPrint(0,65,"ABCDEFGHIJKLMNOP");
  245.     SmallFont.SetSpacing(11);
  246.     SmallFont.BPrint(0,75,"ABCDEFGHIJKLMNOP");
  247.     SmallFont.SetSpacing(12);
  248.     SmallFont.BPrint(0,85,"ABCDEFGHIJKLMNOP");
  249.     SmallFont.SetSpacing(13);
  250.     SmallFont.BPrint(0,95,"ABCDEFGHIJKLMNOP");
  251.     SmallFont.SetSpacing(14,12);
  252.     SmallFont.BPrint(0,105,"ABCDEFGHIJKLMNOP\nABCDEFGHIJKLMNOP");
  253.     oldc1 = 71;
  254.     oldc2 = 75;
  255.     for (i=0; i<32; i++) {
  256.     SmallFont.ChangeColor(oldc1,16 + i*4);
  257.     SmallFont.ChangeColor(oldc2,17 + i*4);
  258.     SmallFont.BPutCh(i*10,167,i);
  259.     oldc1 = 16+i*4;
  260.     oldc2 = 17+i*4;
  261.     }
  262.     SmallFont.SetSpacing();            // restore default spacing
  263.     SmallFont.Repaint(2,oldc1,199,oldc2,201);
  264. }
  265.  
  266.  
  267. void page_6() {
  268.     unsigned int i, j;
  269.     char TestStr[53] = "COLORFONT COLORFONT COLORFONT COLORFONT COLORFONT CO";
  270.     char DispStr[33];
  271.  
  272.     BigFont.BPrint(48,0,"   CLIPPING");
  273.  
  274.     _fmemset(video_buf_w+9620,255,239);
  275.     _fmemset(video_buf_w+28020,255,239);
  276.     for (i=61; i<175; i++) {
  277.        _fmemset(video_buf_w+i*160+20,255,1);
  278.        _fmemset(video_buf_w+i*160+139,255,1);
  279.     }
  280.  
  281.     SmallFont.Repaint(2,199,167,201,171);
  282.     SmallFont.BPrint(10,25,"DEFINE CLIPPING AREA USING THE");
  283.     SmallFont.BPrint(10,45,"           FUNCTION           ");
  284.     SmallFont.Repaint(2,167,105,171,107);
  285.     SmallFont.BPrint(20,35,"SETCLIPAREA(LFT,RGH,TOP,BOT)");
  286.     SmallFont.Repaint(2,105,71,107,74);
  287.     SmallFont.SetClipArea(41,279,61,174);
  288.     for (i=0; i<20; i++) {
  289.     for (j=0; j<32; j++) DispStr[j] = TestStr[j+i];
  290.     SmallFont.CBPrint(0,i*10,DispStr);
  291.     }
  292.     SmallFont.SetClipArea();
  293.     SmallFont.Repaint(2,71,199,74,201);
  294. }
  295.  
  296.  
  297. void page_7() {
  298.  
  299.     SmallFont.SetVideoAddress(doubl_buf);
  300.     BigFont.SetVideoAddress(doubl_buf);
  301.     BigFont.BPrint(34,0,"DOUBLE BUFFERING");
  302.  
  303.     SmallFont.Repaint(2,199,167,201,171);
  304.     SmallFont.BPrint(30,45,"THIS PAGE WAS CREATED IN A");
  305.     SmallFont.BPrint(45,55,"DOUBLE BUFFER USING THE");
  306.     SmallFont.BPrint(25,75,"FUNCTION AND THEN COPIED TO");
  307.     SmallFont.BPrint(100,85,"VGA SCREEN");
  308.     SmallFont.BPrint(60,105,"WITH THE HELP OF THE");
  309.     SmallFont.BPrint(15,125,"FUNCTION, TEXT CAN BE PRINTED");
  310.     SmallFont.BPrint(35,135,"ON VIRTUAL PAGES SIZES OF");
  311.     SmallFont.BPrint(20,145,"WHICH EXCEED THE SIZE OF THE");
  312.     SmallFont.BPrint(65,155,"STANDARD VGA SCREEN");
  313.     SmallFont.Repaint(2,167,105,171,107);
  314.     SmallFont.BPrint(60,65,"SETVIDEOADDRESS(PTR)");
  315.     SmallFont.BPrint(25,115,"SETVSCREENDIM(WIDTH,HEIGHT)");
  316.     SmallFont.Repaint(2,105,199,107,201);
  317.     SmallFont.SetVideoAddress();
  318.     BigFont.SetVideoAddress();
  319. }
  320.  
  321.  
  322. void page_8() {
  323.     BigFont.Repaint(2,36,132,40,136);
  324.     BigFont.BPrint(100,80,"THE END");
  325.     SmallFont.Repaint(2,199,71,201,73);
  326. }
  327.  
  328.  
  329. int press_a_key() {
  330.     int ch;
  331.  
  332.     SmallFont.BPrint(90,189,"PRESS ANY KEY");
  333.     while (kbhit()) getch();
  334.     ch = getch();
  335.     if (ch==27) return 1;        // ESC is pressed -> quit
  336.     return 0;
  337. }
  338.  
  339. void transit_1() {
  340.     int i;
  341.  
  342.     for (i=1; i<=100; i++) {
  343.     _fmemset(video_buf_w+i*160,0xFFFF,320);
  344.     _fmemset(video_buf_w+i*160-160,0x0000,320);
  345.     _fmemset(video_buf_w+(199-i)*160,0xFFFF,320);
  346.     _fmemset(video_buf_w+(199-i)*160+160,0x0000,320);
  347.     delay(10);
  348.     }
  349.     for (i=100; i>=1; i--) {
  350.     _fmemset(video_buf_w+i*160,0x0000,320);
  351.     _fmemset(video_buf_w+i*160-160,0xFFFF,320);
  352.     _fmemset(video_buf_w+(199-i)*160,0x0000,320);
  353.     _fmemset(video_buf_w+(199-i)*160+160,0xFFFF,320);
  354.     delay(10);
  355.     }
  356.     _fmemset(video_buf_w,0x0000,320);
  357.     _fmemset(video_buf_w+160*199,0x0000,320);
  358. }
  359.  
  360.  
  361. void transit_2() {
  362.     int i,j;
  363.     long pos;
  364.  
  365.     for (i=1; i<320; i++) {
  366.     pos = 15999+i;
  367.     for (j=50; j<161; j++) {
  368.         *(video_buf+pos) = 255;
  369.         *(video_buf+pos-1) = 0;
  370.         pos += 320;
  371.     }
  372.     delay(5);
  373.     }
  374.     pos = 16318;
  375.     for (j=50; j<161; j++) {
  376.     *(video_buf+pos) = 0;
  377.     pos += 320;
  378.     }
  379. }
  380.  
  381.  
  382. void transit_3a() {
  383.     int i;
  384.  
  385.     for (i=1; i<=100; i++) {
  386.     _fmemset(video_buf_w+i*160,0xFFFF,320);
  387.     _fmemset(video_buf_w+i*160-160,0x0000,320);
  388.     _fmemset(video_buf_w+(199-i)*160,0xFFFF,320);
  389.     _fmemset(video_buf_w+(199-i)*160+160,0x0000,320);
  390.     delay(10);
  391.     }
  392. }
  393.  
  394. void transit_3b() {
  395.     int i;
  396.  
  397.     for (i=100; i>=1; i--) {
  398.     _fmemcpy(video_buf_w+i*160,doubl_buf+i*320,320);
  399.     _fmemset(video_buf_w+i*160-160,0xFFFF,320);
  400.     _fmemcpy(video_buf_w+(199-i)*160,doubl_buf+(199-i)*320,320);
  401.     _fmemset(video_buf_w+(199-i)*160+160,0xFFFF,320);
  402.     delay(10);
  403.     }
  404.     _fmemcpy(video_buf_w,doubl_buf,320);
  405.     _fmemcpy(video_buf_w+160*199,doubl_buf+320*199,320);
  406. }
  407.  
  408.  
  409. int load_some_palette() {
  410.  
  411.     FILE *fhandle;
  412.     int index;
  413.     unsigned char c_red, c_green, c_blue;
  414.  
  415.     if ((fhandle = fopen("default.pal", "rb")) == NULL)
  416.     return 0;
  417.  
  418.     for (index = 0; index <= 255; index++) {
  419.     if (fscanf(fhandle,"%c%c%c",&c_red,&c_green,&c_blue) != 3)
  420.         return 0;
  421.  
  422.     outportb(PALETTE_MASK, 0xff);
  423.     outportb(PALETTE_REGISTER, index);
  424.     outportb(PALETTE_DATA, c_red);
  425.     outportb(PALETTE_DATA, c_green);
  426.     outportb(PALETTE_DATA, c_blue);
  427.     }
  428.  
  429.     if (fclose(fhandle) == EOF)
  430.     return 0;
  431.     return 1;
  432. }
  433.  
  434.  
  435.  
  436.